(function () {

    // 抽象类
    /* 
        抽象类是提供其他类继承的基类，不能直接被实例化。
        不能创建对象
        专门用来被继承的类

        可以添加抽象方法
    */
    abstract class Animal {
        name: string;
        constructor(name: string) {
            this.name = name;
        }

        // 抽象方法
        // 抽象方法只能放在抽象类中
        // 抽象方法不包含具体实现
        // 抽象方法只能放在抽象类中
        // 子类必须实现抽象方法
        abstract sayHi(): string;
    }

    class Cat extends Animal {
        age: number;
        constructor(name: string, age: number) {
            // 调用父类的constructor(name)
            // super() ** 必须放在子类的构造函数中第一行
            // super() **调用父类的构造函数
            // super() **必须在子类的构造函数中调用
            // super() **必须在子类的构造函数中调用，且必须在使用this之前调用
            // super() **调用父类的构造函数，并传入参数
            super(name);
            this.age = age;
        }
        sayHi(): string {
            return `${this.name}`;
        }
    }

    const cat = new Cat("Tom", 2);
    console.log(cat); // 输出：Cat { name: 'Tom', age: 2 }
    console.log(cat.sayHi()); // 输出：Tom

})()